]> dgit.raspbian.org Git - gnome-shell.git/commitdiff
appDisplay: Don't show apps in NoDisplay categories in the All view
authorJasper St. Pierre <jstpierre@mecheye.net>
Mon, 11 Jun 2012 17:53:32 +0000 (13:53 -0400)
committerJasper St. Pierre <jstpierre@mecheye.net>
Mon, 11 Jun 2012 17:55:59 +0000 (13:55 -0400)
We explicitly include NoDisplay applications in the ShellAppSystem because
we want app tracking for them, but we explicitly filter NoDisplay applications
out when showing them to the user because we don't want to show them to the
user. We also based our "All" apps view on a flattened list of apps. While
we did check for NoDisplay on the app item itself, we didn't check against
its parents. Refactor the app display view to not use a separate flat list
of applications, but instead a concatenation of all the applications in all
the loaded categories.

https://bugzilla.gnome.org/show_bug.cgi?id=658176

js/ui/appDisplay.js
js/ui/iconGrid.js
src/shell-app-system.c
src/shell-app-system.h

index 8ce181179810e92f0e34ed2007f4b74ba2dd74e7..ad7b70dbb859dce30ccceec23ad342f14361a9d0 100644 (file)
@@ -22,6 +22,7 @@ const Search = imports.ui.search;
 const Tweener = imports.ui.tweener;
 const Workspace = imports.ui.workspace;
 const Params = imports.misc.params;
+const Util = imports.misc.util;
 
 const MAX_APPLICATION_WORK_MILLIS = 75;
 const MENU_POPUP_TIMEOUT = 600;
@@ -36,6 +37,7 @@ const AlphabeticalView = new Lang.Class({
 
         this._pendingAppLaterId = 0;
         this._appIcons = {}; // desktop file id
+        this._allApps = [];
 
         let box = new St.BoxLayout({ vertical: true });
         box.add(this._grid.actor, { y_align: St.Align.START, expand: true });
@@ -60,16 +62,22 @@ const AlphabeticalView = new Lang.Class({
             }));
     },
 
-    _removeAll: function() {
+    removeAll: function() {
         this._grid.removeAll();
         this._appIcons = {};
+        this._allApps = [];
     },
 
-    _addApp: function(app) {
+    addApp: function(app) {
         var id = app.get_id();
-        let appIcon = new AppWellIcon(app);
+        if (this._appIcons[id] !== undefined)
+            return;
 
-        this._grid.addItem(appIcon.actor);
+        let appIcon = new AppWellIcon(app);
+        let pos = Util.insertSorted(this._allApps, app, function(a, b) {
+            return a.compare_by_name(b);
+        });
+        this._grid.addItem(appIcon.actor, pos);
         appIcon.actor.connect('key-focus-in', Lang.bind(this, this._ensureIconVisible));
 
         this._appIcons[id] = appIcon;
@@ -120,14 +128,6 @@ const AlphabeticalView = new Lang.Class({
                 icon.actor.visible = true;
             }
         }
-    },
-
-    setAppList: function(apps) {
-        this._removeAll();
-        for (var i = 0; i < apps.length; i++) {
-            var app = apps[i];
-            this._addApp(app);
-         }
     }
 });
 
@@ -147,7 +147,6 @@ const ViewByCategories = new Lang.Class({
         // (used only before the actor is mapped the first time)
         this._currentCategory = -2;
         this._categories = [];
-        this._apps = null;
 
         this._categoryBox = new St.BoxLayout({ vertical: true,
                                                reactive: true,
@@ -204,8 +203,10 @@ const ViewByCategories = new Lang.Class({
             if (nextType == GMenu.TreeItemType.ENTRY) {
                 var entry = iter.get_entry();
                 var app = this._appSystem.lookup_app_by_tree_entry(entry);
-                if (!entry.get_app_info().get_nodisplay())
+                if (!entry.get_app_info().get_nodisplay()) {
+                    this._view.addApp(app);
                     appList.push(app);
+                }
             } else if (nextType == GMenu.TreeItemType.DIRECTORY) {
                 if (!dir.get_is_nodisplay())
                     this._loadCategory(iter.get_directory(), appList);
@@ -213,7 +214,7 @@ const ViewByCategories = new Lang.Class({
         }
     },
 
-    _addCategory: function(name, index, dir, allApps) {
+    _addCategory: function(name, index, dir) {
         let button = new St.Button({ label: GLib.markup_escape_text (name, -1),
                                      style_class: 'app-filter',
                                      x_align: St.Align.START,
@@ -225,7 +226,6 @@ const ViewByCategories = new Lang.Class({
 
         var apps;
         if (dir == null) {
-            apps = allApps;
             this._allCategoryButton = button;
         } else {
             apps = [];
@@ -239,6 +239,7 @@ const ViewByCategories = new Lang.Class({
     },
 
     _removeAll: function() {
+        this._view.removeAll();
         this._categories = [];
         this._categoryBox.destroy_all_children();
     },
@@ -246,13 +247,8 @@ const ViewByCategories = new Lang.Class({
     refresh: function() {
         this._removeAll();
 
-        var allApps = Shell.AppSystem.get_default().get_all();
-        allApps.sort(function(a, b) {
-            return a.compare_by_name(b);
-        });
-
         /* Translators: Filter to display all applications */
-        this._addCategory(_("All"), -1, null, allApps);
+        this._addCategory(_("All"), -1, null);
 
         var tree = this._appSystem.get_tree();
         var root = tree.get_root_directory();
@@ -270,7 +266,6 @@ const ViewByCategories = new Lang.Class({
             }
         }
 
-        this._view.setAppList(allApps);
         this._selectCategory(-1);
 
         if (this._focusDummy) {
index 82a9552b80b5bd491eb2082f956299578e6b34a1..81f5cef84b428eb26d42fbcf1fe86e645c19d62d 100644 (file)
@@ -313,8 +313,11 @@ const IconGrid = new Lang.Class({
         this._grid.destroy_all_children();
     },
 
-    addItem: function(actor) {
-        this._grid.add_actor(actor);
+    addItem: function(actor, index) {
+        if (index !== undefined)
+            this._grid.insert_child_at_index(actor, index);
+        else
+            this._grid.add_actor(actor);
     },
 
     getItemAtIndex: function(index) {
index a7d1441566d92fa62150284daeeab4cf78a49992..56ff9eb910def9d7c1ca55c905e281d4c1187721 100644 (file)
@@ -644,30 +644,6 @@ shell_app_system_lookup_wmclass (ShellAppSystem *system,
   return app;
 }
 
-/**
- * shell_app_system_get_all:
- * @system:
- *
- * Returns: (transfer container) (element-type ShellApp): All installed applications
- */
-GSList *
-shell_app_system_get_all (ShellAppSystem  *self)
-{
-  GSList *result = NULL;
-  GHashTableIter iter;
-  gpointer key, value;
-
-  g_hash_table_iter_init (&iter, self->priv->id_to_app);
-  while (g_hash_table_iter_next (&iter, &key, &value))
-    {
-      ShellApp *app = value;
-      
-      if (!g_desktop_app_info_get_nodisplay (shell_app_get_app_info (app)))
-        result = g_slist_prepend (result, app);
-    }
-  return result;
-}
-
 void
 _shell_app_system_notify_app_state_changed (ShellAppSystem *self,
                                             ShellApp       *app)
index b76c6425f179c12e2f43e159fbd55689441a87be..d261fe4cc12ebb2a0ab322d54d5da61688e78d9f 100644 (file)
@@ -52,8 +52,6 @@ ShellApp       *shell_app_system_lookup_heuristic_basename    (ShellAppSystem  *
 ShellApp       *shell_app_system_lookup_wmclass               (ShellAppSystem *system,
                                                                const char     *wmclass);
 
-GSList         *shell_app_system_get_all                   (ShellAppSystem  *system);
-
 GSList         *shell_app_system_get_running               (ShellAppSystem  *self);
 
 GSList         *shell_app_system_initial_search            (ShellAppSystem  *system,